package controllers

import (
	"net/http"
	"strconv"

	"game-simple/internal/framework/auth/dto"
	"game-simple/internal/framework/auth/services"

	"github.com/gin-gonic/gin"
)

type UserController struct {
	service *services.UserService
}

func NewUserController() *UserController {
	return &UserController{
		service: services.NewUserService(),
	}
}

// Create 创建用户
// @Summary      创建用户
// @Description  创建新用户账户
// @Tags         用户管理
// @Accept       json
// @Produce      json
// @Security     BearerAuth
// @Param        user body dto.UserCreateRequest true "用户信息"
// @Success      200 {object} dto.UserResponse "创建成功"
// @Failure      400 {object} map[string]string "请求参数错误或用户名/邮箱已存在"
// @Failure      401 {object} map[string]string "未授权"
// @Router       /users [post]
func (c *UserController) Create(ctx *gin.Context) {
	var req dto.UserCreateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	user, err := c.service.Create(&req)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, user)
}

// Get 获取用户信息
// @Summary      获取用户信息
// @Description  根据用户ID获取用户详细信息
// @Tags         用户管理
// @Accept       json
// @Produce      json
// @Security     BearerAuth
// @Param        id path int true "用户ID"
// @Success      200 {object} dto.UserResponse "用户信息"
// @Failure      400 {object} map[string]string "无效的用户ID"
// @Failure      401 {object} map[string]string "未授权"
// @Failure      404 {object} map[string]string "用户不存在"
// @Router       /users/{id} [get]
func (c *UserController) Get(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	user, err := c.service.GetByID(uint(id))
	if err != nil {
		ctx.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, user)
}

// Update 更新用户信息
// @Summary      更新用户信息
// @Description  更新指定用户的信息
// @Tags         用户管理
// @Accept       json
// @Produce      json
// @Security     BearerAuth
// @Param        id path int true "用户ID"
// @Param        user body dto.UserUpdateRequest true "更新的用户信息"
// @Success      200 {object} dto.UserResponse "更新成功"
// @Failure      400 {object} map[string]string "请求参数错误"
// @Failure      401 {object} map[string]string "未授权"
// @Failure      404 {object} map[string]string "用户不存在"
// @Router       /users/{id} [put]
func (c *UserController) Update(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	var req dto.UserUpdateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	user, err := c.service.Update(uint(id), &req)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, user)
}

// Delete 删除用户
// @Summary      删除用户
// @Description  删除指定用户（软删除）
// @Tags         用户管理
// @Accept       json
// @Produce      json
// @Security     BearerAuth
// @Param        id path int true "用户ID"
// @Success      200 {object} map[string]string "删除成功"
// @Failure      400 {object} map[string]string "无效的用户ID"
// @Failure      401 {object} map[string]string "未授权"
// @Router       /users/{id} [delete]
func (c *UserController) Delete(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	if err := c.service.Delete(uint(id)); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"message": "删除成功"})
}
